package xfuzzy.xfhl.view;

import java.awt.BorderLayout;
import java.awt.Rectangle;
import java.util.Observable;
import java.util.Observer;
import javax.swing.Box;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import xfuzzy.lang.Specification;
import xfuzzy.util.XConstants;
import xfuzzy.xfedit.XfeditStructure;
import xfuzzy.xfhl.model.XfhlData;

/**
 * Clase que encapsula la vista de un objeto XfhlData
 * 
 * @author Sergio Cala Cordero, Septiembre 2009, Herramienta XFHL
 * 
 */
public class XfhlDataView implements Observer {

	/**
	 * Instancia del Modelo, objeto observado
	 * */
	private XfhlData data;

	/**
	 * Grafico que pintara la estructura jerarquica
	 */
	private XfeditStructure xfeditStructure;

	/**
	 * Especificacion actual que tiene el box
	 */
	private Specification spec;

	/**
	 * Box que contine el grafico
	 */
	private Box box;

	/**
	 * Barra de progreso del aprendizaje
	 */
	private JProgressBar progress;

	/**
	 * Identificador del objeto
	 */
	private int idDataView;

	/**
	 * Panel que contiene el box
	 */
	private JPanel jpanel;

	/**
	 * Constructor
	 * 
	 * @param idDataView
	 *            Identificador del XfhlDataView
	 * @param data
	 *            Obejto XfhlData al que observara este objeto
	 */
	public XfhlDataView(int idDataView, XfhlData data) {
		this.idDataView = idDataView;
		this.data = data;
		initialize();
	}

	/**
	 * Constructor que te genera el grafico en el box de la clase
	 * 
	 * @param spec
	 *            Especificacion que mostrara el grafico
	 */
	public XfhlDataView(Specification spec) {
		this.data = new XfhlData(-1, 1);
		initialize();
		this.spec = spec;
		this.xfeditStructure = getGraphStructure(spec);
		this.box = buildStructureBox(this.xfeditStructure);
	}

	/**
	 * Inicializa el objeto, crea el jpanel y la barra de progreso
	 */
	private void initialize() {
		this.jpanel = new JPanel(new BorderLayout());
		this.progress = new JProgressBar();
		this.progress.setBounds(new Rectangle(10, 291, 825, 19));
		this.progress.setMaximum(this.data.getEpochIni());
		this.progress.setValue(0);
		this.progress.setStringPainted(true);
		this.progress.setFont(XConstants.proggresfont);
		this.progress.setBackground(XConstants.proggresColorBackGround);
	}

	/**
	 * Metodo para implementar el Observer
	 */
	public void update(Observable arg0, Object arg1) {

		// Verificamos que sea nuestro objeto
		if (arg0 == this.data) {
			// Comprobamos el cambio
			int change = ((XfhlData) arg0).getChange();
			switch (change) {
				case XfhlData.NEW_SPEC:
					this.spec = this.data.getSpec();
					this.xfeditStructure = getGraphStructure(spec);
					this.box = buildStructureBox(this.xfeditStructure);
					this.jpanel.add(this.box);
					break;
				case XfhlData.DEC_EPOCH:
					this.progress.setValue(this.progress.getValue() + 1);
					break;

				case XfhlData.FINAL_SPEC:
					// Eliminamos el box del jpanel
					this.jpanel.removeAll();
					// Restauramos el valor a 0
					this.progress.setValue(0);
					break;
				default:
					break;
			}
			this.jpanel.revalidate();
		}
	}

	/**
	 * Construye el area de la estructura jerarquica del sistema
	 */
	private Box buildStructureBox(XfeditStructure graph) {

		Box verticalBox = Box.createVerticalBox();
		verticalBox.add(new JScrollPane(graph));
		return verticalBox;
	}

	/**
	 * Construye el area de la estructura jerarquica del sistema
	 */
	private XfeditStructure getGraphStructure(Specification spec) {
		return new XfeditStructure(this, spec.getSystemModule());
	}

	/**
	 * GETTERS AND SETTERS
	 * */
	public Box getBox() {
		return this.box;
	}

	public XfhlData getData() {
		return this.data;
	}

	public JPanel getJPanel() {
		return this.jpanel;
	}

	public JProgressBar getJProgressBar() {
		return this.progress;
	}

	public int getIdDataView() {
		return this.idDataView;
	}

}
